package main

import (
	"demo/fibonacci"
	"demo/shape"
	"fmt"
	"sort"
)

func main() {
	// 定义一个圆形实例, 半径为1，直径为2
	circle, err := shape.NewCircle(1)
	if err != nil {
		panic(err)
	}

	// 定义一个三角形实例，底边2，高2
	triangle, err := shape.NewTriangle(2, 2)
	if err != nil {
		panic(err)
	}

	// 定义一个长方形实例，长2，宽2
	rectangle, err := shape.NewRectangle(2, 2)
	if err != nil {
		panic(err)
	}

	// 1、实现对圆形、三角形、长方形求面积。
	fmt.Println("Circle Area -->", circle.Area())
	fmt.Println("Triangle Area -->", triangle.Area())
	fmt.Println("Rectangle Area -->", rectangle.Area())

	// 2、利用第1题，构造3个以上图形，至少圆形、三角形、矩形各有一个，对上题的图形按照面积降序排列
	shapes := []shape.Shape{circle, triangle, rectangle}
	fmt.Println("排序前==>", shapes)
	sort.Slice(shapes, func(i, j int) bool {
		return shapes[i].Area() > shapes[j].Area()
	})
	fmt.Println("排序后==>", shapes)

	// 3、分析斐波那契数列递推公式递归版本的问题，试着为该函数提供一个Cache，使其计算效率提升
	for i := 1; i <= 10; i++ {
		fmt.Print(fibonacci.FibWithCache(i), " ")
	}
	fmt.Println()

	// 4、8年前的今天上午9点30分
	//     要求：
	//     1. 毫秒时间戳是多少？
	//     2. 格式化输出时间为 2005/09/10 21:35:40 +0800 的形式
	//     3. 请问那天是周几？到那天，本年已经过了多少周？
	//     4. 距离今天已经过了多少天了？

}
